<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    //1.1 输出结果,并写出为什么 ？
    for (var i = 0; i <= 5; i++) {
      setTimeout(() => {
    console.log(i);
      }, i * 1000)
    }
    console.log(i);

    //1.2 以上代码如果想输出6,0,1,2,3,4,5,怎么实现?

    // 解：输出7个6，先出一个6，然后每隔一秒输出一个6，共出6个

    for (var i = 0; i <= 5; i++) {
      function zxc(i) {
        setTimeout(() => {
          console.log(i)
        })
      }
      zxc(i)
    }

    console.log(i);

    // for (var i = 0; i <= 5; i++) {
    //   (function (i) {
    //     setTimeout(() => { console.log(i) });
    //   })(i)
    // }
    // console.log(i);
    // 解：因为var存在变量提升 每次循环var被重新定义了  而let不存在变量提升


    //2.输出结果,并写出为什么 ？

    // var obj1 = {
    //   a: 1,
    //   b: 2,
    //   c: 3,
    //   d: {
    //     e: 4
    //   }
    // }
    // var obj2 = { ...obj1 }
    // obj1.a = 2
    // obj1.d.e = 5
    // console.log(obj2);
    // 解：输出{
    //   a: 1,
    //     b: 2,
    //       c: 3,
    //         d: {
    //     e: 5
    //   }
    // }
    // 浅拷贝只是对第一层数据实现了深拷贝，第二层或者更深一层依旧会改变原数据 

    //3.输出结果，并写出为什么 ？
    setTimeout(() => {
      // console.log(1);
    }, 0)
    new Promise((resolve, reject) => {
      // console.log(2);  //这里是同步
      resolve()
    }).then(() => {
      // console.log(4);
    })
    console.log('这里是同步');
    // 解： 2 这里是同步  4  1  同步优先异步靠边

    //4.数组去重,写出至少2种方法
    // let arr = [12, 24, 37, 37, 24, 49, 49, 55, 55]
    // console.log(Array.from(new Set(arr)));

    // let arr1 = []
    // arr.forEach(item => {
    //   if (arr1.indexOf(item) == -1) {
    //     arr1.push(item)
    //   }
    // })
    // console.log(arr1);

    // let arr2 = []
    // arr2 = arr.filter(item => {
    //   if (!arr2.includes(item)) {
    //     return arr2.push(item)
    //   }
    // })
    // console.log(arr2);
    //5.2 写出几个合并对象方法,要求传入obj11,obj22,输出obj33的结果
    // 示例
    // let obj11 = {
    //   a: 1,
    //   b: {
    //     b1: 21
    //   }
    // }

    // let obj22 = {
    //   a: 2,
    //   b: {
    //     b2: 22
    //   }
    // }
    // //通过深拷贝,要求返回结果
    // let obj33 = {
    //   a: 2,
    //   b: {
    //     b1: 21,
    //     b2: 22
    //   }
    // }
    // function zxc(obj1, obj2) {
    //   if (Object.prototype.toString.call(obj1) === '[object Object]' && Object.prototype.toString.call(obj2) === '[object Object]') {
    //     for (var key in obj2) {
    //       obj1[key] = zxc(obj1[key], obj2[key])
    //     }
    //   } else if (Object.prototype.toString.call(obj1) === '[object Array]' && Object.prototype.toString.call(obj2) === '[object Array]') {
    //     obj1 = obj1.concat(obj2)
    //   } else {
    //     return obj1 = obj2
    //   }
    //   return obj1
    // }
    // console.log(zxc(obj11, obj22));
    //6.2 写一个方法统计字符串中出现最多的字母与次数
    // var str = "abcdaaaaaaaa"; //输出出现最多的字母是a,次数为9
    // let obj = {}
    // for (var i = 0; i < str.length; i++) {
    //   if (!obj[str[i]]) {
    //     obj[str[i]] = 1
    //   } else {
    //     obj[str[i]]++
    //   }
    // }
    // let max = 1
    // let who = ''
    // for (var item in obj) {
    //   if (max < obj[item]) {
    //     max = obj[item]
    //     who = item
    //   }
    // }
    // console.log(max);
    // console.log(who);

    //7. 编写通用方法,把URL参数解析为一个对象，如：var url = “http://witmax.cn/index.php?key0=0&key1=1&key2=2″;    返回数据{key0: "0", key1: "1", key2: "2"}
    var url = 'http://witmax.cn/index.php?key0=0&key1=1&key2=2';
    function zxc(url) {
      let obj = {}
      url.split('?')[1].split('&').forEach(item => {
        obj[item.split('=')[0]] = item.split('=')[1]
      })
      return obj
    }
    console.log(zxc(url));
  </script>
</body>

</html>